
/**
 * Version: 1.0.0
 * Author: Fun
 * Create: 2015-09-06
 * Update: 2018-1-25
 * QQ    : 244015867
 * Des   : 授权等微信相关操作
 */

(function () {

    var wxUtils = {};

    var TOKEN_HEADNAME = "Local_Authorization";
    var LOCAL_USERINFO = "localUserInfo";

    var CODE = "code";
    var userinfo = null;
    // var ValidTime = 1500; // 25分钟的有效期 服务器是30分钟
    var serverUrl = 'http://api.juzhen05.com/';
    var localAppid = null; // 暂存的appid

    var defaulAppid = 'wx8c6852df92fcfc6b'; // 默认为“矩阵微信活动公众号”

    window.localUserInfo = window.localUserInfo || JSON.parse(localStorage.getItem(LOCAL_USERINFO)) // 本地的userinfo

    function timeNow() {
        return parseInt(Date.now() / 1000);
    }

    /**
     * 获取浏览器后缀参数 ?xx=xxx&xxx=xxx
     */
    function GetQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]);
        return null;
    }
    window.GetQueryString = window.GetQueryString || GetQueryString;

    /**
    * 获得/设置授权信息
    */
    function getToken() {
        return localStorage.getItem(TOKEN_HEADNAME);
    }
    function setToken(data) {
        return localStorage.setItem(TOKEN_HEADNAME, data);
    }

    function localToTpa(url) {
        var tpaUrl = "http://wechat.juzhen05.com/tpa_autho.html";
        var origin = url.split('http://')[1];
        origin = origin.replace(/\//g, '*');
        if (origin.indexOf('?') >= 0) {
            origin = origin.split('?')[0] // 不要尾巴，尾巴都已经在tpaUrl了
            origin = origin.split('index.html')[0]; //  不要index.html
        }

        if (url.indexOf('?') >= 0) {
            var arr1 = url.split('?');
            var arr2 = arr1[1].split('&');
            var num = 0;
            for (var i = 0; i < arr2.length; i++) {
                if (arr2[i].indexOf('code') < 0) { // code的参数过滤掉，这里无用
                    if (num === 0) {
                        tpaUrl = tpaUrl + '?' + arr2[i];
                    } else {
                        tpaUrl = tpaUrl + '&' + arr2[i];
                    }
                    num++;
                }
            }
            tpaUrl = tpaUrl + '&origin=' + origin;
        } else {
            tpaUrl = tpaUrl + '?origin=' + origin;
        }
        return tpaUrl;
    }

    /**
     * 跳转到授权链接，重新授权
     */

    function reAutho() {
        localStorage.clear(TOKEN_HEADNAME)
        localStorage.clear(LOCAL_USERINFO)

        var isWechat = (window.location.href.indexOf('wechat.juzhen05.com') >= 0)

        var localUrl = location.href;
        // 本域名的情况
        if (isWechat) {
            window.location.href = authoUrl(localUrl);
            return;
        }

        // 第三方域名的情况
        // 将toUri的参数全部转移到tpaUrl上面去, 到时再从tpa转回来
        // http://wx.juzhen.net/2554/index.html?sdf=234  ===>
        // http://weichat.juzhen.net/tpa_autho.html?origin=wx.juzhen.net*2554*index.html&sdf=234 ==<

        var tpaUrl = localToTpa(localUrl);

        window.location.href = authoUrl(tpaUrl);
    }

    /**
     * 生成授权链接
     */
    function authoUrl(url, state) {
        var newUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='
            + localAppid
            + '&redirect_uri='
            + encodeURIComponent(url) + '&response_type=code&scope=snsapi_userinfo&state=' + (state ? encodeURIComponent(state) : 'STATE') + '#wechat_redirect';
        return newUrl;
    }

    /**
     * ajax请求封装
     * token与userinfo逻辑的封装
     * 
     * @param {*} params // {method,url,data}
     * @param {*} cb 
     */
    function weAjax(params, cb) {

        // 如果有token，就每次都附带上
        if (!params.data) {
            params.data = {};
        }
        var token = localStorage.getItem(TOKEN_HEADNAME);
        if (token) {
            params.data[TOKEN_HEADNAME] = localStorage.getItem(TOKEN_HEADNAME);
        }

        $.ajax({
            type: params.method,
            url: params.url,
            data: params.data,
            dataType: 'json',
            success: function (data) {
                localStorage.setItem(TOKEN_HEADNAME, token);
                if(!data.error_code){
                    if (cb) cb(data.data);
                }else{
                    alert(dataJson.data);
                }
            },
            error: function (data) {
                alert("请求失败：" + data)
            }
        })

    }

    /*
    * 注意：
    * 1. 所有的JS接口只能在公众号绑定的域名下调用，公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
    * 2. 如果发现在 Android 不能分享自定义内容，请到官网下载最新的包覆盖安装，Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
    * 3. 常见问题及完整 JS-SDK 文档地址：http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
    *
    * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决，如仍未能解决可通过以下渠道反馈：
    * 邮箱地址：weixin-open@qq.com
    * 邮件主题：【微信JS-SDK反馈】具体问题
    * 邮件内容说明：用简明的语言描述问题所在，并交代清楚遇到该问题的场景，可附上截屏图片，微信团队会尽快处理你的反馈。
    */

    /**
     * jsdsdk授权请求
     * @param {*} debug 
     * @param {*} appid 
     */
    function jssdkConfig(appid, debug, cb) {
        $.post(serverUrl + 'jssdk_autho', { appid: appid || defaulAppid }, function (configData) {
            localAppid = localAppid || appid || defaulAppid; // 强制jssdk与用户授权同步
            wx.config({
                debug: debug || false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: localAppid, // 必填，公众号的唯一标识
                timestamp: configData.timestamp, // 必填，生成签名的时间戳
                nonceStr: configData.noncestr, // 必填，生成签名的随机串
                signature: configData.signature,
                jsApiList: [
                    'checkJsApi',
                    'onMenuShareTimeline',
                    'onMenuShareAppMessage',
                    'onMenuShareQQ',
                    'onMenuShareWeibo',
                    'onMenuShareQZone',
                    'hideMenuItems',
                    'showMenuItems',
                    'hideAllNonBaseMenuItem',
                    'showAllNonBaseMenuItem',
                    'translateVoice',
                    'startRecord',
                    'stopRecord',
                    'onVoiceRecordEnd',
                    'playVoice',
                    'onVoicePlayEnd',
                    'pauseVoice',
                    'stopVoice',
                    'uploadVoice',
                    'downloadVoice',
                    'chooseImage',
                    'previewImage',
                    'uploadImage',
                    'downloadImage',
                    'getNetworkType',
                    'openLocation',
                    'getLocation',
                    'hideOptionMenu',
                    'showOptionMenu',
                    'closeWindow',
                    'scanQRCode',
                    'chooseWXPay',
                    'openProductSpecificView',
                    'addCard',
                    'chooseCard',
                    'openCard'
                ]
            });
            if (cb) cb();
        })
    }

    /**
     * 用户授权
     * 
     */
    function userAutho(appid, cb, debug) {
        localAppid = localAppid || appid || defaulAppid; // 强制jssdk与用户授权同步
        var token = getToken();
        var code = GetQueryString('code');

        // 是否授过
        if (token && localUserInfo) {
            // 申请刷新
            $.post(serverUrl + 'checkAutho', {
                token: token
            }, function (data) {
                if (!data.error_code) {
                    // 刷新成功
                    if (debug) alert('授权刷新成功');
                    setToken(data.token);
                    if (cb) cb();
                } else {
                    // 刷新失败,进行新授权
                    reAutho();
                }
            });

        } else if (code) { // 是否有code
            if (debug) alert('正在请求新授权');
            $.post(serverUrl + 'wx_autho', {
                code: code,
                appid: localAppid
            }, function (data) {
                if (!data.error_code) {
                    localUserInfo = data.userInfo;
                    localStorage.setItem(LOCAL_USERINFO, JSON.stringify(data.userInfo));
                    setToken(data.token);
                    console.log('欢迎您 :' + data.userInfo.nickname);
                    if (debug) alert('授权成功!');
                    if (cb) cb();
                } else {
                    if (debug) alert('code失效，重新进行授权!');
                    reAutho();
                }
            });

        } else {
            if (debug) alert('使用长连接地址授权');
            reAutho();
        }

    }

    /**
     * 分享设置
     */

    function wxShare(shareData) {
        wx.onMenuShareAppMessage(shareData);
        wx.onMenuShareTimeline(shareData);
    }

    wx.error(function (res) {
        // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
        console.log(res)
    });

    /**
    * 获得/设置用户
    */
    wxUtils.getUserInfo = function () {
        return JSON.parse(localStorage.getItem(TOKEN_HEADNAME))
    }
    // wxUtils.setUserInfo = function (data) {
    //     return localStorage.setItem(LOCAL_USERINFO, JSON.stringify(data));
    // }

    wxUtils.getToken = getToken;
    wxUtils.setToken = setToken;
    
    window.weAjax = weAjax;
    window.jssdkConfig = jssdkConfig;
    window.userAutho = userAutho;
    window.authoUrl = authoUrl;
    window.wxUtils = wxUtils;
    window.wxShare = wxShare;
}())
